package com.o.Reflection;

import java.lang.reflect.Method;

/**
 * 利用反射进行调用方法
 *
 * getMethod()获得方法对象
 * invoke(对象，方法参数类型.class) 执行方法    相当于类名.方法名
 * setAccessible(true)获得私有变量的权限
 * 反射是一种java的底层技术，可以突破封装
 *
 * @author Mc.Chai
 * @program: Java基础
 * @create 2021-11-30-14:58 14:58
 */
public class TestInvokeMethods {
    public static void main(String[] args) throws Exception {
        //创建了一个类（Teacher）的对象(可以通过工厂方法进行创建)
        Object object=Class.forName("com.o.Reflection.Teacher").newInstance();
        //通过老师的类的对象获得一个类的对象
        Class c=object.getClass();
        //通过类对象获得其中的一个方法（teach方法，无参）
        Method teach = c.getMethod("teach", null);
        //通过invoke，让teacher实例方法执行起来。所需的对象，作为第一个参数，所需的方法调用实参（方法参数），作为第二个参数
        teach.invoke(object,null);
        //调用单个参数的方法
        Method teach1 = c.getMethod("teach", int.class);
        teach1.invoke(object,11);
        //调用三个参数的方法
        Method study = c.getMethod("study", int.class, double.class);
        study.invoke(object,11,12.5);
        //调用私有的方法,注意使用getDeclaredMethod才能找到私有方法对象
        Method run = c.getDeclaredMethod("run", null);
        run.setAccessible(true);    //为获取私有方法获取权限
        run.invoke(object,null  );
    }
}
class Teacher{
    String name;
    Integer age;
    String sex;
    Double salary;
    public Teacher(){

    }
    public Teacher(String name,Integer age,String sex,Double salary){

        this.name=name;
        this.age=age;
        this.sex=sex;
        this.salary=salary;
    }

    public void teach(){
        System.out.println("teach()---Execute");
    }
    public void teach(int a){
        System.out.println("teach(int a)---Execute");
    }
    public void study(int a,double b){
        System.out.println("study(int a,double b)---Execute");
    }
    private void run(){
        System.out.println("run()---Execute");
    }
}
